Shell脚本实战14-开发脚本实现入侵检测与报警

1. 需求

监控Web站点目录(比如/var/html/www)下的所有文件是否被恶意篡改(文件内容被更改了),如果有则打印改动的文件名(发邮件),定时任务每3分钟执行一次。

2. 过程

2.1. 问题分析

  1. 首先要说明的是,思考过程的积累比实际代码开发的能力积累更重要。
  2. 什么是恶意篡改,只要是未经过许可的改动都是篡改。
  3. 文件内容被改动了会有如下特征:
    • 大小可能会变化
    • 修改时间会变化
    • 文件内容会变化,利用md5sum指纹校验
    • 增加或删除文件,比对每次检测前后的文件数量

2.2. 参考解答

本案例主要采用md5sum的方法来实现。

2.2.1. 第一步

在企业网站发布代码之后,即对所有网站数据建立初始指纹库和文件库,这个步骤很重要,没有基础的指纹库,无法进行入侵检测。

以/var/html/www作为站点目录为例:

  1. 建立测试数据

    1
    2
    3
    4
    # mkdir /var/html/www -p #<==创建站点目录
    # cp -a /etc/a* /var/html/www/ #<==复制少量测试数据
    # cp -a /etc/b* /var/html/www/ #<==复制少量测试数据
    # ls /var/html/www/ #<==检查
  2. 建立初始的文件指纹库

    1
    2
    # find /var/html/www -type f | xargs md5sum > /opt/zhiwen.db.ori #<==建立文件内容指纹库
    # tail /opt/zhiwen.db.ori #<==查看指纹库
  3. 建立初始的文件库

    1
    2
    # find /var/html/www -type f > /opt/wenjian.db.ori #<==建立文件数量和名字库
    # tail /opt/wenjian.db.ori #<查看文件库

2.2.2. 第二步

检测文件内容和文件数量变化

  1. 检测文件内容变化:

    1
    2
    3
    4
    5
    # echo theshu >> /var/html/www/audisp/plugins.d/af_unix.conf #<==篡改文件
    # export LANG=en #<==调整字符集
    # md5sum -c --quiet /opt/zhiwen.db.ori #<==检查所有文件的内容是否变化
    /var/html/www/audisp/plugins.d/af_unix.conf: FAILED #<==变化的会被打印出来
    md5sum: WARNING: 1 of 33 computed checksums did NOT match #<==综合提示
  2. 检测文件数量变化

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # echo theshu.txt > /var/html/www/test.txt #<==模拟增加新文件
    # md5sum -c --quiet /opt/zhiwen.db.ori #<==利用指纹库无法检测新增文件
    /var/html/www/audisp/plugins.d/af_unix.conf: FAILED
    md5sum: WARNING: 1 of 33 computed checksums did NOT match
    # find /var/html/www -type f > /opt/wenjian.db_curr.ori
    #<==获取检测前的所有文件数量和文件名
    # diff /opt/wenjian.db* #<==采用diff命令比较
    18d17
    < /var/html/www/test.txt #<==test.txt就是新增的

2.2.3. 第三步

开发检测指纹识别脚本。

首先,人工做如下操作:

1
2
# find /var/html/www -type f | xargs md5sum > /opt/zhiwen.db.ori
# find /var/html/www -type f > /opt/wenjian.db.ori

脚本检测会以上述两个命令获取的结果为原始的正确依据,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/bash
RETVAL=0 #<==状态初始化
export LANG=en #<==调整字符集
CHECK_DIR=/var/html/www #<==定义要检测的站点目录
[ -e $CHECK_DIR ] || exit 1 #<==如果目录不存在则退出脚本
ZhiWenDbOri="/opt/zhiwen.db.ori" #<==定义原始指纹库路径
FileCountDbOri="/opt/wenjian.db.ori" #<==定义原始文件库路径
ErrLog="/opt/err.log" #<==定义检测后的内容日志
[ -e $ZhiWenDbOri ] || exit 1 #<==如果原始指纹库不存在则退出脚本
[ -e $FileCountDbOri ] || exit 1 #<==如果原始文件库不存在则退出脚本
#judge file count
echo "# md5sum -c --quiet /opt/zhiwen.db.ori" > $ErrLog #<==打印检测命令
md5sum -c --quiet /opt/zhiwen.db.ori &>> $ErrLog #<==实际执行检测命令
RETVAL=$? #<==收集返回值
#com file count
find $CHECK_DIR -type f > /opt/wenjian.db_curr.ori #<==实际执行检测命令,获取最新文件数量等
echo "# diff /opt/wenjian.db*" &>> $ErrLog #<==打印检测命令
diff /opt/wenjian.db* &>> $ErrLog #<==实际执行检测命令,对比文件数量及文件名变化情况
if [ $RETVAL -ne 0 -o `diff /opt/wenjian.db* | wc -l` -ne 0 ]
#<==如果返回值不为0,或者对比结果行数不为0,则进入判断。
then
mail -s "`uname -n` $(date +%F) err" theshu@qq.com <$ErrLog #<==发送邮件
else
echo "Sites dir is ok" | mail -s "`uname -n` $(date +%F) is ok" theshu@qq.com
fi

然后,利用定时任务检查,命令如下:

1
2
3
# crontab -1 | tail -2
*/3 * * * * /bin/sh /server/scripts/xxx.sh > /dev/null 2>&1

3. 补充

现在来思考一下,在企业中一般什么文件需要做指纹验证呢?

系统命令、用户文件、配置文件、启动文件等重要文件,都要监控起来,另外,在实际工作中应对所有的用户操作做日志审计,让所有人的操作无处遁形,起到威慑和监督的作用,从而减少被当作“黑锅侠”的风险。

0%